import { makeAutoObservable, observable } from 'mobx';
import * as api from './api';

export default class UserStore {
  _args = {
    search: {
    },
    pg: {
      page: 0,
      sort: ['ts;desc'],
      size: 10,
    },
  };
  total = 0;
  logs = [];
  modal = [];
  loading = false;

  constructor(rootStore) {
    this.rootStore = rootStore;
    makeAutoObservable(this, { rootStore: false });
  }

  /**
   * 使用设置的请求参数和分页配置请求列表数据
   * 分页参数为空时保持当前分页配置
   * @param {object} pgInfo 分页参数
   */
  * query(pgInfo) {
    _.mergeWith(this._args.pg, pgInfo, (o, s) => (_.isArray(o) ? s : undefined)); // 数组直接赋值，不合并
    const { search, pg } = toJS(this._args);
    if (!pg.sort?.length) delete pg.sort;
    this.loading = true;
    try {
      this.total = yield api.count({ search });
      this.logs = yield api.search({ search, pg });
    } finally {
      this.loading = false;
    }
  }

  idx(i) {
    return this._args.pg.page * this._args.pg.size + i + 1;
  }

  get pg() {
    return this._args.pg;
  }

  set pg(pg) {
    this.query({ ...pg });
  }

  get search() {
    this._args.pg.page = 0;
    return this._args.search;
  }

  set search(search) {
    this._args.pg.page = 0;
    this._args.search = search;
    this.query({ page: 0 });
  }

  get tableSort() {
    if (this._args.pg.sort?.length) {
      const [fn, dir] = this._args.pg.sort[0].split(';');
      return { [fn]: dir };
    }
    return undefined;
  }


  /**
   * 对象扁平化
   * @param {*} obj 数据源
   * @param {*} parentKey
   * @param {*} result 返回
   * @returns
   */
  flattenObject(obj, parentKey = '', result = {}) {
    for (const key in obj) {
      // eslint-disable-next-line @iceworks/best-practices/recommend-polyfill, no-prototype-builtins
      if (obj.hasOwnProperty(key)) {
        const newKey = parentKey ? `${parentKey}.${key}` : key;

        if (typeof obj[key] === 'object' && obj[key] !== null) {
          this.flattenObject(obj[key], newKey, result);
        } else {
          result[newKey] = obj[key];
        }
      }
    }
    return result;
  }
}
